package timing.ukulele.http.converter;

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonWriter;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okio.Buffer;
import org.jetbrains.annotations.NotNull;
import retrofit2.Converter;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * @author fengxici
 */
public final class Utf8GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    private static final Charset UTF_8 = StandardCharsets.UTF_8;
    private final Gson gson;
    private final TypeAdapter<T> adapter;

    Utf8GsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public RequestBody convert(@NotNull T value) throws IOException {
       try( Buffer buffer = new Buffer()) {
           Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
           JsonWriter jsonWriter = gson.newJsonWriter(writer);
           adapter.write(jsonWriter, value);
           jsonWriter.flush();
           return RequestBody.create(buffer.readByteString(), MEDIA_TYPE);
       }
    }
}